#include <iostream>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstring>
#include <sys/wait.h>

using namespace std;

int main()
{
    // 将字符串 "./tongxin.txt" 的地址赋值给指针 fileName，这个指针指向的字符串内容不能被修改。
    const char *fileName = "./tongxin.txt";
    int fd = open(fileName, O_RDWR);
    if (fd == -1)
    {
        perror("open error");
        exit(-1);
    } 

    // 获取文件大小
    off_t length = lseek(fd, 0, SEEK_END);
    void *address = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (address == MAP_FAILED)
    {
        perror("mmap error");
        exit(-1);
    }

    // 关闭文件描述符
    close(fd);

    // 创建进程
    pid_t pid = fork();
    if (pid < 0)
    {
        perror("fork error");
        exit(-1);
    }
    else if (pid == 0)
    {
        // 子进程
        sleep(1);
        cout << "data:" << (char *)address << endl;

        // 退出
        _exit(0);
    }
    else
    {
        // 父进程
        // 往共享内存里写数据
        const char *data = "hello world.";
        strcpy(static_cast<char *>(address), data);

        // 回收子进程资源
        wait(NULL);
    }

    // 释放共享内存空间
    munmap(address, length);

    return 0;
}